JavaScript 正则表达式(RegExp)实用指南 (二)【译】
快速实践指南。用示例理解正则表达式。
在 JavaScript 正则表达式(RegExp)实用指南(一) 介绍了正则表达式的含义,创建方法和测试方法,接下来我们来看下正则表达式中的特殊字符等。
简单的正则表达式模式
这是最基本的模式,只需将文字文本与测试字符串匹配即可。例如:
var regex = /hello/;
console.log(regex.test('hello world'));
// true
特殊字符
到目前为止,我们已经创建了简单的正则表达式模式。现在,让我们在处理更复杂的情况时充分利用正则表达式的全部功能。
例如,我们在一堆邮箱地址中,我们要排除qq邮箱。那是特殊字符起作用的地方。为了完全理解正则表达式,你必须记住一些特殊的符号和字符。
标志
正则表达式具有五个可选的标志或修饰符。让我们讨论两个最重要的标志:
g
— 常用于执行一个全局搜索匹配, 即(不仅仅返回第一个匹配的, 而是返回全部)i
— 不区分大小写搜索。
还可以在单个正则表达式中用多个标志。他们的顺序对结果没有任何影响。
让我们看一些代码示例:
正则表达式字面量 — 语法 /pattern/flags
var regexGlobal = /abc/g;
console.log(regexGlobal.test('abc abc'));
// 它将匹配所有的'abc',在第一次匹配后不会返回
var regexInsensitive = /abc/i;
console.log(regexInsensitive.test('Abc'));
// returns true, 因为忽略大小写
正则表达式构造函数 — 语法 new RegExp('pattern', 'flags')
var regexGlobal = new RegExp('abc','g')
console.log(regexGlobal.test('abc abc'));
// 它将匹配所有的'abc',在第一次匹配后不会返回
var regexInsensitive = new RegExp('abc','i')
console.log(regexInsensitive.test('Abc'));
// returns true, 因为忽略大小写
字符集:
[xyz]
— 字符集是在一个位置匹配不同字符的一种方法,它可以匹配括号内出现的字符中字符串中的任何一个字符。例如:
var regex = /[bt]ear/;
console.log(regex.test('tear'));
// returns true
console.log(regex.test('bear'));
// return true
console.log(regex.test('fear'));
// return false
[^xyz]
— ^
用在一个方括号的开头的时候, 它表示这个字符集是否定的,它可以匹配除了括号内出现的字符中字符串中的任何一个字符。例如:
var regex = /[^bt]ear/;
console.log(regex.test('tear'));
// returns false
console.log(regex.test('bear'));
// return false
console.log(regex.test('fear'));
// return true
[a-z]
— 如果我们想将一个字母的所有字母都匹配在一个位置,我们可以将所有字母写在方括号内,但是有一种更简单的方法,那就是范围。例如:[a-h]将匹配从a到h的所有字母,[0-9]
将匹配从a到h的所有数字,[A-Z]将匹配所有大写字母。
var regex = /[a-z]ear/;
console.log(regex.test('fear'));
// returns true
console.log(regex.test('tear'));
// returns true
元字符 — 元字符是具有特殊含义的字符。一共有很多元字符,但我将在这里介绍最重要的字符。
\d
— 匹配一个数字。等价于[0-9]
。\w
— 匹配一个单字字符(字母、数字或者下划线)。等价于[A-Za-z0-9_]
。即字母数字字符。\s
— 匹配一个空白字符,包括空格、制表符、换页符和换行符。\t
— 匹配一个水平制表符 (U+0009)。\b
— 匹配单词的开头或结尾。也称为字边界。.
— (小数点)默认匹配除换行符之外的任何单个字符。\D
— 匹配一个非数字字符。等价于[^0-9]
。\W
— 匹配一个非单字字符。等价于[^A-Za-z0-9_]
\S
— 匹配一个非空白字符。
量词 — 量词是在正则表达式中具有特殊含义的符号。
+
— 匹配前面一个表达式 1 次或者多次。var regex = /\d+/;
console.log(regex.test('8'));
// true
console.log(regex.test('88899'));
// true
console.log(regex.test('8888845'));
// true*
— 匹配前一个表达式 0 次或多次。var regex = /go*d/;
console.log(regex.test('gd'));
// true
console.log(regex.test('god'));
// true
console.log(regex.test('good'));
// true
console.log(regex.test('goood'));
// true?
— 匹配前面一个表达式 0 次或者 1 次。var regex = /goo?d/;
console.log(regex.test('god'));
// true
console.log(regex.test('good'));
// true
console.log(regex.test('goood'));
// false^
— 匹配字符串的开头,紧随其后的正则表达式应位于测试字符串的开头。var regex = /^g/;
console.log(regex.test('good'));
// true
console.log(regex.test('bad'));
// false
console.log(regex.test('tag'));
// false$
— 匹配字符串的末尾,即在它之前的正则表达式应位于测试字符串的末尾。var regex = /.com$/;
console.log(regex.test('test@testmail.com'));
// true
console.log(regex.test('test@testmail'));
// false{N}
— N 是一个正整数,匹配了前面一个字符刚好出现了 N 次。var regex = /go{2}d/;
console.log(regex.test('good'));
// true
console.log(regex.test('god'));
// false{N,}
— N 是一个正整数,匹配前一个字符至少出现了 N 次。var regex = /go{2,}d/;
console.log(regex.test('good'));
// true
console.log(regex.test('goood'));
// true
console.log(regex.test('gooood'));
// true{N,M}
— N 和 M 都是整数。匹配前面的字符至少 N 次,最多 M 次。var regex = /go{1,2}d/;
console.log(regex.test('god'));
// true
console.log(regex.test('good'));
// true
console.log(regex.test('goood'));
// falseX|Y
— 匹配 X 或者 Yvar regex = /(green|red) apple/;
console.log(regex.test('green apple'));
// true
console.log(regex.test('red apple'));
// true
console.log(regex.test('blue apple'));
// false
如果表达式中包括特殊字符, 例如要匹配 +
或 .
, 就必须使用转义符号(\
).
var regex = /a+b/; // This won't work
var regex = /a\+b/; // This will work
console.log(regex.test('a+b')); // true
高级一点的用法
(x)
— 匹配x并记住匹配。这些称为捕获组。这也用于在正则表达式中创建子表达式。例如 :
var regex = /(foo)bar\1/;
console.log(regex.test('foobarfoo'));
// true
console.log(regex.test('foobar'));
// false
\1
记住并使用括号中第一个子表达式中的匹配项(上面的例子 \1
等同于 foo
)。
(?:x)
— 匹配x,不记住匹配。这些称为非捕获组。这里的\1
将不起作用,它将与字符串 \1
匹配。
var regex = /(?:foo)bar\1/;
console.log(regex.test('foobarfoo'));
// false
console.log(regex.test('foobar'));
// false
console.log(regex.test('foobar\1'));
// true
x(?=y)
— 匹配 x 仅仅当 x 后面跟着 y 。这种叫做先行断言。
var regex = /Red(?=Apple)/;
console.log(regex.test('RedApple'));
// true
在上面的示例中,仅当Red
紧跟Apple
时,匹配才会发生。
为你推荐